package com.lc.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lc.reggie.dto.DishDto;
import com.lc.reggie.entity.Category;
import com.lc.reggie.entity.Dish;
import com.lc.reggie.entity.DishFlavor;
import com.lc.reggie.service.CategoryService;
import com.lc.reggie.service.DishFlavorService;
import com.lc.reggie.service.DishService;
import com.lc.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

/**
 * 菜品管理&菜品口味
 */
@Slf4j
@RestController
@RequestMapping("/dish")
public class DishController
{
	@Autowired
	private DishService dishService;
	
	@Autowired
	private DishFlavorService dishFlavorService;
	
	@Autowired
	private CategoryService categoryService;
	
	@Autowired
	private RedisTemplate redisTemplate;
	
	/**
	 * 新增菜品
	 * @param dishDto
	 * @return
	 */
	@PostMapping
	public R<String> save(@RequestBody DishDto dishDto)
	{
		log.info(dishDto.toString());
		
		dishService.saveWithFlavor(dishDto);
		
		//清理所有菜品的缓存数据
		//Set keys = redisTemplate.keys("dish_*");
		//redisTemplate.delete(keys);
		
		//清理某个分类下面的菜品缓存数据
		String key = "dish_" + dishDto.getCategoryId() + "_1";
		redisTemplate.delete(key);
		
		return R.success("新增菜品成功");
	}
	
	/**
	 * 菜品信息分页查询
	 * @param page
	 * @param pageSize
	 * @param name
	 * @return
	 */
	@GetMapping("/page")
	public R<Page> getPage(int page, int pageSize, String name)
	{
		//构造分页构造器对象
		Page<Dish> pageInfo = new Page<>(page, pageSize);
		Page<DishDto> dishDtoPage = new Page<>();
		
		//条件构造器
		LambdaQueryWrapper<Dish> lqw = new LambdaQueryWrapper<>();
		//添加过滤条件
		lqw.like(name != null, Dish::getName, name);
		//添加排序条件
		lqw.orderByDesc(Dish::getUpdateTime);
		//执行分页查询
		dishService.page(pageInfo, lqw);
		
		//对象拷贝
		BeanUtils.copyProperties(pageInfo, dishDtoPage, "records");
		
		List<Dish> records = pageInfo.getRecords();
		List<DishDto> list = records.stream().map((item) -> {
			DishDto dishDto = new DishDto();
			
			BeanUtils.copyProperties(item, dishDto);
			
			//分类id
			Long categoryId = item.getCategoryId();
			//根据id查询分类对象
			Category category = categoryService.getById(categoryId);
			
			if (category != null)
			{
				String categoryName = category.getName();
				dishDto.setCategoryName(categoryName);
			}
			
			return dishDto;
		}).collect(Collectors.toList());
		
		dishDtoPage.setRecords(list);
		
		return R.success(dishDtoPage);
	}
	
	/**
	 * 根据id查询菜品信息和对应的口味信息
	 * @param id
	 * @return
	 */
	@GetMapping("/{id}")
	public R<DishDto> getById(@PathVariable Long id)
	{
		DishDto dishDto = dishService.getByIdWithFlavor(id);
		
		return R.success(dishDto);
	}
	
	/**
	 * 修改菜品
	 * @param dishDto
	 * @return
	 */
	@PutMapping
	public R<String> update(@RequestBody DishDto dishDto)
	{
		log.info(dishDto.toString());
		
		dishService.updateWithFlavor(dishDto);
		
		//清理所有菜品的缓存数据
		//Set keys = redisTemplate.keys("dish_*");
		//redisTemplate.delete(keys);
		
		//清理某个分类下面的菜品缓存数据
		String key = "dish_" + dishDto.getCategoryId() + "_1";
		redisTemplate.delete(key);
		
		return R.success("修改菜品成功");
	}
	
	/**
	 * 根据条件查询对应的菜品数据
	 * @param dish
	 * @return
	 */
//	@GetMapping("/list")
//	public R<List<Dish>> getList(Dish dish)
//	{
//		//构造查询条件
//		Long categoryId = dish.getCategoryId();
//		LambdaQueryWrapper<Dish> lqw = new LambdaQueryWrapper<>();
//		lqw.eq(categoryId != null, Dish::getCategoryId, categoryId);
//
//		//添加条件，查询状态为1（起售状态）的菜品
//		lqw.eq(Dish::getStatus, 1);
//
//		//添加排序条件
//		lqw.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);
//
//		List<Dish> list = dishService.list(lqw);
//
//		return R.success(list);
//	}
	
	@GetMapping("/list")
	public R<List<DishDto>> getList(Dish dish)
	{
		List<DishDto> dishDtoList = null;
		//动态构造key
		String key = "dish_" + dish.getCategoryId() + "_" + dish.getStatus();//dish_1397844391040167938_1
		
		//先从redis中获取缓存数据
		dishDtoList = (List<DishDto>) redisTemplate.opsForValue().get(key);
		
		if (dishDtoList != null)
		{
			//如果存在，直接返回，无需查询数据库
			return R.success(dishDtoList);
		}
		
		//构造查询条件
		Long categoryId = dish.getCategoryId();	//分类id
		LambdaQueryWrapper<Dish> lqw1 = new LambdaQueryWrapper<>();
		lqw1.eq(categoryId != null, Dish::getCategoryId, categoryId);
		
		//添加条件，查询状态为1（起售状态）的菜品
		lqw1.eq(Dish::getStatus, 1);
		
		//添加排序条件
		lqw1.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);
		
		List<Dish> list = dishService.list(lqw1);
		
		dishDtoList = list.stream().map(item -> {
			DishDto dishDto = new DishDto();
			BeanUtils.copyProperties(item, dishDto);
			//根据id查询分类对象
			Category category = categoryService.getById(categoryId);
			if (category != null)
			{
				String categoryName = category.getName();
				dishDto.setCategoryName(categoryName);
			}
			//当前菜品的id
			Long dishId = item.getId();
			LambdaQueryWrapper<DishFlavor> lqw2 = new LambdaQueryWrapper<>();
			lqw2.eq(DishFlavor::getDishId, dishId);
			List<DishFlavor> dishFlavors = dishFlavorService.list(lqw2);
			dishDto.setFlavors(dishFlavors);
			return dishDto;
		}).collect(Collectors.toList());
		
		//如果不存在，需要查询数据库，将查询到的菜品数据缓存到Redis
		redisTemplate.opsForValue().set(key, dishDtoList, 60, TimeUnit.MINUTES);
		
		return R.success(dishDtoList);
	}
	
	/**
	 * 删除菜品
	 * @param ids
	 * @return
	 */
	@DeleteMapping
	public R<String> delete(@RequestParam List<Long> ids)
	{
		log.info("ids :{}", ids);
		
		dishService.deleteWithFlavor(ids);
		
		//清理所有菜品的缓存数据
		Set keys = redisTemplate.keys("dish_*");
		redisTemplate.delete(keys);
		
		//清理某个分类下面的菜品缓存数据
		//		String key = "dish_" + dishDto.getCategoryId() + "_1";
		//		redisTemplate.delete(key);
		
		return R.success("菜品删除成功");
	}
	
	/**
	 * 批量停售或起售
	 * @param status
	 * @param ids
	 * @return
	 */
	@PostMapping("/status/{status}")
	public R<String> StopOrStartSell(@PathVariable Integer status, @RequestParam List<Long> ids)
	{
		log.info("status: {}", status);
		log.info("ids: {}", ids);
		//将所有的菜品更新售卖状态
		dishService.stopOrStartSell(status, ids);
		
		//清理所有菜品的缓存数据
		Set keys = redisTemplate.keys("dish_*");
		redisTemplate.delete(keys);
		
		//清理某个分类下面的菜品缓存数据
//		String key = "dish_" + dishDto.getCategoryId() + "_1";
//		redisTemplate.delete(key);
		
		return R.success(status == 0 ? "停售成功" : "起售成功");
	}
}
